/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ipartek.formacion.gestformwww.modelo.clases;

import com.ipartek.formacion.gestformwww.controlador.Verificador;
import com.ipartek.formacion.gestformwww.modelo.beans.CandConv;
import com.ipartek.formacion.gestformwww.modelo.beans.Empresa;
import com.ipartek.formacion.gestformwww.modelo.beans.Estado;
import com.ipartek.formacion.gestformwww.modelo.beans.Procedencia;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import com.ipartek.formacion.gestformwww.modelo.interfaces.ICandConvDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Clase que contiene los metodos para gestionar CandConv en la BBDD
 * @author Jon Mikel y Fran
 */
public class SQLServerCandConvDAO implements ICandConvDAO {

    private static ResourceBundle rb;

    public SQLServerCandConvDAO() {
        rb = ResourceBundle.getBundle("com.ipartek.formacion.gestformwww.controlador.excepciones");
    }

    /**
     * Metodo para obtener un objeto CandConv de la BBDD a partir del ID de Candidato y COnvocatoria
     * @param idCand ID del Candidato
     * @param IdConv ID de la Convocatoria
     * @return Objeto CandConv
     * @throws GestorFormacionExcepcion
     */
    public CandConv buscarCandConv(int idCand, int IdConv) throws GestorFormacionExcepcion {
        CandConv candConv = new CandConv();
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            sentencia = "SELECT CanId, ConId, EstId, FechaEntrevista, NumReserva, "
                    + "Observaciones, NotaTest, FechaUltContacto "
                    + "FROM CandConv "
                    + "WHERE CanId=? AND ConId=? ";
            PreparedStatement stmt = con.prepareStatement(sentencia);
            stmt.setInt(1, idCand);
            stmt.setInt(2, IdConv);
            ResultSet rs = stmt.executeQuery();

            if (rs.next()) {
                candConv.setCanId(rs.getInt("CanId"));
                candConv.setConvId(rs.getInt("ConId"));
                candConv.setEstId(rs.getInt("EstId"));                
                candConv.setFechEntr(rs.getTimestamp("FechaEntrevista"));
                candConv.setNumRsv(rs.getInt("NumReserva"));
                candConv.setObs(rs.getString("Observaciones"));
                candConv.setNotaTest(rs.getInt("NotaTest"));
                candConv.setfechUltContacto(rs.getTimestamp("FechaUltContacto"));                
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
            return candConv;
        }
    }

    /**
     * Metodo para insertar un objeto CandConv en la BBDD
     * @param candconv Objeto CandConv a insertar
     * @throws GestorFormacionExcepcion
     */
    public void insertarCandConv(CandConv candConv) throws GestorFormacionExcepcion {
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            sentencia = "INSERT INTO CandConv (CanId, ConId, EstId, FechaEntrevista, NumReserva,"
                    + "Observaciones, NotaTest, FechaUltContacto)"
                    + " VALUES(?,?,?,?,?,?,?,?)";
            PreparedStatement stmt = con.prepareStatement(sentencia);
            stmt.setInt(1, candConv.getCanId());
            stmt.setInt(2, candConv.getConvId());
            stmt.setInt(3, candConv.getEstId());
            stmt.setTimestamp(4, (Timestamp) candConv.getFechEntr());
            stmt.setInt(5, candConv.getNumRsv());
            stmt.setString(6, candConv.getObs());
            stmt.setInt(7, candConv.getNotaTest());
            stmt.setTimestamp(8, (Timestamp) candConv.getfechUltContacto());

            stmt.executeUpdate();
            stmt.close();

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }

    /**
     * Metodo para modificar un registro de CandConv
     * @param candconv Objeto CandConv que contiene la informacion a modificar
     * @throws GestorFormacionExcepcion
     */
    public void modificarCandConv(CandConv candconv) throws GestorFormacionExcepcion {
        //CandConv candConv = new CandConv();
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            sentencia = "UPDATE CandConv SET EstId = ?, FechaEntrevista = ?, NumReserva = ?, "
                    + "Observaciones = ?, NotaTest = ?, FechaUltContacto = ?"
                    + " WHERE CanId = " + candconv.getCanId()
                    + " AND ConId = " + candconv.getConvId();
            PreparedStatement stmt = con.prepareStatement(sentencia);
            stmt.setInt(1, candconv.getEstId());
            stmt.setTimestamp(2, (Timestamp) candconv.getFechEntr());
            stmt.setInt(3, candconv.getNumRsv());
            stmt.setString(4, candconv.getObs());
            stmt.setInt(5, candconv.getNotaTest());
            stmt.setTimestamp(6, (Timestamp) candconv.getfechUltContacto());

            stmt.executeUpdate();
            stmt.close();

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }

    /**
     * Metodo que borra un registro de CandConv con las IDs de Candidato y Convocatoria especificados
     * @param idCand ID de Candidato
     * @param IdConv ID de la Convocatoria
     * @throws GestorFormacionExcepcion
     */
    public void eliminarCandConv(int idCand, int IdConv) throws GestorFormacionExcepcion {
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            sentencia = "DELETE FROM CandConv WHERE CanId = ? AND ConId = ?";
            PreparedStatement stmt = con.prepareStatement(sentencia);
            stmt.setInt(1, idCand);
            stmt.setInt(2, IdConv);
            stmt.executeUpdate();
            stmt.close();

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }
    /*SINO FUNCIONA EL CODIGO DE ARRIBA PROBAR CON ESTE
     * Connection con = null;
        PreparedStatement sql =null;
        PreparedStatement stmt = null;
        ResultSet rs = null;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            con.setAutoCommit(false);

            // Buscamos si el candidato está en más convocatorias
            sql = con.prepareStatement("SELECT ConId FROM CandConv WHERE canId=" + canId);
            rs = sql.executeQuery();

            //BORRAMOS la informacion del candidato en la convocatoria
            stmt = con.prepareStatement("DELETE FROM CandConv WHERE CanId=" + canId + " AND conId=" + conId);
            stmt.executeUpdate();

            con.commit();
            stmt.close();
            rs.close();
            sql.close();
        } catch (SQLException ex) {
            try {
                con.rollback();
            } catch (SQLException ex1) {
                throw new GestorFormacionExcepcion(rb.getString("no-sql"));
            }
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
     */

    /**
     * Metodo que devuelve un ArrayList de Estados de la BBDD
     * @return ArrayList de Estado
     * @throws GestorFormacionExcepcion
     */
    public ArrayList<Estado> listaEstados() throws GestorFormacionExcepcion {
        ArrayList<Estado> listaEstados = new ArrayList();
        Estado miEstado = null;
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            sentencia = "SELECT EstId, EstDescr, EstPosibles FROM Estado ";
            PreparedStatement stmt = con.prepareStatement(sentencia);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                miEstado = new Estado();
                miEstado.setEstId(rs.getInt("EstId"));
                miEstado.setDescripcion(rs.getString("EstDescr"));
                miEstado.setEstPosibles(rs.getString("EstPosibles"));
                listaEstados.add(miEstado);

            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
            return listaEstados;
        }
    }

    /**
     * Metodo que devuelve un ArrayList de Empresas de la BBDD
     * @return ArrayList de Empresas
     * @throws GestorFormacionExcepcion
     */
    public ArrayList<Empresa> listaEmpresas() throws GestorFormacionExcepcion {
        ArrayList<Empresa> listaEmpresas = new ArrayList();
        Empresa miEmpresa = null;
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            sentencia = "SELECT EmpId, EmpCIF, EmpDir, EmpTlf1, EmpTlf2, EmpMail, EmpWeb, EmpNom, EmpObserv FROM Empresa ";
            PreparedStatement stmt = con.prepareStatement(sentencia);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                miEmpresa = new Empresa();
                miEmpresa.setEmpId(rs.getInt("EmpId"));
                miEmpresa.setEmpCIF(rs.getString("EmpCIF"));
                miEmpresa.setEmpDir(rs.getString("EmpDir"));
                if (Verificador.comprobarTelefono("EmpTlf1")) {
                    miEmpresa.setEmpTlf1(rs.getString("EmpTlf1"));
                }
                if (Verificador.comprobarTelefono("EmpTlf2")) {
                    miEmpresa.setEmpTlf2(rs.getString("EmpTlf2"));
                }
                if (Verificador.esEmail("EmpMail")) {
                    miEmpresa.setEmpMail(rs.getString("EmpMail"));
                }
                miEmpresa.setEmpWeb(rs.getString("EmpWeb"));
                miEmpresa.setEmpNom(rs.getString("EmpNom"));
                miEmpresa.setEmpObserv(rs.getString("EmpObserv"));
                listaEmpresas.add(miEmpresa);

            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
            return listaEmpresas;
        }
    }

    /**
     * Metodo que devuelve un ArrayList de Procedencias de la BBDD
     * @return ArrayList de Procedencias
     * @throws GestorFormacionExcepcion
     */
    public ArrayList<Procedencia> listaProcedencias() throws GestorFormacionExcepcion {
        ArrayList<Procedencia> listaProcedencias = new ArrayList();
        Procedencia miProcedencia = null;
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            sentencia = "SELECT ProId, ProDescr FROM Procedencia ";
            PreparedStatement stmt = con.prepareStatement(sentencia);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                miProcedencia = new Procedencia();
                miProcedencia.setProId(rs.getInt("ProId"));
                miProcedencia.setProDescr(rs.getString("ProDescr"));
                listaProcedencias.add(miProcedencia);

            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
            return listaProcedencias;
        }
    }
}
